🎖️GitЯра🎖️
src/helpers/sensors/EnvironmentSensorManager.cpp 93b2db63de9009af047a2d0e1bcd97b4b0ba7106 (93b2db63) Text, 29.93 KB
Tff7b72#Tff7b72include T8b949e"EnvironmentSensorManager.h"
Tff7b72#Tff7b72include T8b949e<Wire.h>
Tff7b72#Tff7b72if ENV_PIN_SDA && ENV_PIN_SCL
Tff7b72#Tff7b72define TELEM_WIRE &Wire1 T8b949e// Use Wire1 as the I2C bus for Environment Sensors
Tff7b72#Tff7b72else
Tff7b72#Tff7b72define TELEM_WIRE &Wire T8b949e// Use default I2C bus for Environment Sensors
Tff7b72#Tff7b72endif
T8b949e// ============================================================
T8b949e// Sensor library includes and static driver instances
T8b949e// ============================================================
Tff7b72#Tff7b72if ENV_INCLUDE_BME680_BSEC
Tff7b72#Tff7b72ifndef TELEM_BME680_ADDRESS
Tff7b72#Tff7b72define TELEM_BME680_ADDRESS 0x76
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72define TELEM_BME680_SEALEVELPRESSURE_HPA (1013.25)
Tff7b72#Tff7b72include T8b949e<bsec.h>
Tff7b72#Tff7b72include T8b949e<Adafruit_LittleFS.h>
Tff7b72#Tff7b72include T8b949e<InternalFileSystem.h>
Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3bsec_config_iaqTb4b4b4[Tb4b4b4] Tff7b72= Tb4b4b4{
Tff7b72#Tff7b72include T8b949e"config/generic_33v_3s_28d/bsec_iaq.txt" T8b949e// 3.3v, LP, 28 day background calibration window
Tb4b4b4}Tb4b4b4;
Tff7b72static Te6edf3Bsec Te6edf3bsec_iaqTb4b4b4;
Tff7b72static Tffa657float Te6edf3bsec_temperature Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72static Tffa657float Te6edf3bsec_humidity Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72static Tffa657float Te6edf3bsec_pressure_hpa Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72static Tffa657float Te6edf3bsec_iaq_val Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72static Tffa657uint8_t Te6edf3bsec_accuracy Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72static Tffa657bool Te6edf3bsec_active Tff7b72= Tffa657falseTb4b4b4;
Tff7b72static Tffa657bool Te6edf3bsec_data_ready Tff7b72= Tffa657falseTb4b4b4;
Tff7b72static Tffa657bool Te6edf3bsec_first_save_done Tff7b72= Tffa657falseTb4b4b4;
Tff7b72static Tffa657uint32_t Te6edf3bsec_last_save_ms Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72#Tff7b72define BSEC_STATE_FILE "Tff7b72/Tff7b72bsec_state.bin"
Tff7b72#Tff7b72define BSEC_SAVE_INTERVAL_MS (8UL * 60 * 60 * 1000) T8b949e// 8 hour state-save interval
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72ifdef ENV_INCLUDE_BME680
Tff7b72#Tff7b72ifndef TELEM_BME680_ADDRESS
Tff7b72#Tff7b72define TELEM_BME680_ADDRESS 0x76
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72define TELEM_BME680_SEALEVELPRESSURE_HPA (1013.25)
Tff7b72#Tff7b72include T8b949e<Adafruit_BME680.h>
Tff7b72static Te6edf3Adafruit_BME680 Td2a8ffBME680Tb4b4b4(Te6edf3TELEM_WIRETb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72ifdef ENV_INCLUDE_BMP085
Tff7b72#Tff7b72define TELEM_BMP085_SEALEVELPRESSURE_HPA (1013.25)
Tff7b72#Tff7b72include T8b949e<Adafruit_BMP085.h>
Tff7b72static Te6edf3Adafruit_BMP085 Te6edf3BMP085Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if ENV_INCLUDE_AHTX0
Tff7b72#Tff7b72ifndef TELEM_AHTX_ADDRESS
Tff7b72#Tff7b72define TELEM_AHTX_ADDRESS 0x38 T8b949e// AHT10, AHT20 temperature and humidity sensor I2C address
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72include T8b949e<Adafruit_AHTX0.h>
Tff7b72static Te6edf3Adafruit_AHTX0 Te6edf3AHTX0Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if ENV_INCLUDE_BME280
Tff7b72#Tff7b72ifndef TELEM_BME280_ADDRESS
Tff7b72#Tff7b72define TELEM_BME280_ADDRESS 0x76 T8b949e// BME280 environmental sensor I2C address
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72define TELEM_BME280_SEALEVELPRESSURE_HPA (1013.25) T8b949e// Atmospheric pressure at sea level
Tff7b72#Tff7b72include T8b949e<Adafruit_BME280.h>
Tff7b72static Te6edf3Adafruit_BME280 Te6edf3BME280Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if ENV_INCLUDE_BMP280
Tff7b72#Tff7b72ifndef TELEM_BMP280_ADDRESS
Tff7b72#Tff7b72define TELEM_BMP280_ADDRESS 0x76 T8b949e// BMP280 environmental sensor I2C address
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72define TELEM_BMP280_SEALEVELPRESSURE_HPA (1013.25) T8b949e// Atmospheric pressure at sea level
Tff7b72#Tff7b72include T8b949e<Adafruit_BMP280.h>
Tff7b72static Te6edf3Adafruit_BMP280 Td2a8ffBMP280Tb4b4b4(Te6edf3TELEM_WIRETb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if ENV_INCLUDE_SHTC3
Tff7b72#Tff7b72include T8b949e<Adafruit_SHTC3.h>
Tff7b72static Te6edf3Adafruit_SHTC3 Te6edf3SHTC3Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if ENV_INCLUDE_SHT4X
Tff7b72#Tff7b72ifndef TELEM_SHT4X_ADDRESS
Tff7b72#Tff7b72define TELEM_SHT4X_ADDRESS 0x44
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72include T8b949e<SensirionI2cSht4x.h>
Tff7b72static Te6edf3SensirionI2cSht4x Te6edf3SHT4XTb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if ENV_INCLUDE_LPS22HB
Tff7b72#Tff7b72include T8b949e<Arduino_LPS22HB.h>
Te6edf3LPS22HBClass Td2a8ffLPS22HBTb4b4b4(Tff7b72*Te6edf3TELEM_WIRETb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if ENV_INCLUDE_INA3221
Tff7b72#Tff7b72ifndef TELEM_INA3221_ADDRESS
Tff7b72#Tff7b72define TELEM_INA3221_ADDRESS 0x42 T8b949e// INA3221 3 channel current sensor I2C address
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72ifndef TELEM_INA3221_SHUNT_VALUE
Tff7b72#Tff7b72define TELEM_INA3221_SHUNT_VALUE 0.100 T8b949e// most variants will have a 0.1 ohm shunts
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72ifndef TELEM_INA3221_NUM_CHANNELS
Tff7b72#Tff7b72define TELEM_INA3221_NUM_CHANNELS 3
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72include T8b949e<Adafruit_INA3221.h>
Tff7b72static Te6edf3Adafruit_INA3221 Te6edf3INA3221Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if ENV_INCLUDE_INA219
Tff7b72#Tff7b72ifndef TELEM_INA219_ADDRESS
Tff7b72#Tff7b72define TELEM_INA219_ADDRESS 0x40 T8b949e// INA219 single channel current sensor I2C address
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72include T8b949e<Adafruit_INA219.h>
Tff7b72static Te6edf3Adafruit_INA219 Td2a8ffINA219Tb4b4b4(Te6edf3TELEM_INA219_ADDRESSTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if ENV_INCLUDE_INA260
Tff7b72#Tff7b72ifndef TELEM_INA260_ADDRESS
Tff7b72#Tff7b72define TELEM_INA260_ADDRESS 0x41 T8b949e// INA260 single channel current sensor I2C address
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72include T8b949e<Adafruit_INA260.h>
Tff7b72static Te6edf3Adafruit_INA260 Te6edf3INA260Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if ENV_INCLUDE_INA226
Tff7b72#Tff7b72ifndef TELEM_INA226_ADDRESS
Tff7b72#Tff7b72define TELEM_INA226_ADDRESS 0x44
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72define TELEM_INA226_SHUNT_VALUE 0.100
Tff7b72#Tff7b72define TELEM_INA226_MAX_AMP 0.8
Tff7b72#Tff7b72include T8b949e<INA226.h>
Tff7b72static Te6edf3INA226 Td2a8ffINA226Tb4b4b4(Te6edf3TELEM_INA226_ADDRESSTb4b4b4, Te6edf3TELEM_WIRETb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if ENV_INCLUDE_MLX90614
Tff7b72#Tff7b72ifndef TELEM_MLX90614_ADDRESS
Tff7b72#Tff7b72define TELEM_MLX90614_ADDRESS 0x5A T8b949e// MLX90614 IR temperature sensor I2C address
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72include T8b949e<Adafruit_MLX90614.h>
Tff7b72static Te6edf3Adafruit_MLX90614 Te6edf3MLX90614Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if ENV_INCLUDE_VL53L0X
Tff7b72#Tff7b72ifndef TELEM_VL53L0X_ADDRESS
Tff7b72#Tff7b72define TELEM_VL53L0X_ADDRESS 0x29 T8b949e// VL53L0X time-of-flight distance sensor I2C address
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72include T8b949e<Adafruit_VL53L0X.h>
Tff7b72static Te6edf3Adafruit_VL53L0X Te6edf3VL53L0XTb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if ENV_INCLUDE_RAK12035
Tff7b72#Tff7b72ifndef TELEM_RAK12035_ADDRESS
Tff7b72#Tff7b72define TELEM_RAK12035_ADDRESS 0x20 T8b949e// RAK12035 Soil Moisture sensor I2C address
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72include T8b949e"RAK12035_SoilMoisture.h"
Tff7b72static Te6edf3RAK12035_SoilMoisture Te6edf3RAK12035Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if ENV_INCLUDE_GPS && defined(RAK_BOARD) && !defined(RAK_WISMESH_TAG)
Tff7b72#Tff7b72define RAK_WISBLOCK_GPS
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72ifdef RAK_WISBLOCK_GPS
Tff7b72static Tffa657uint32_t Te6edf3gpsResetPin Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72static Tffa657bool Te6edf3i2cGPSFlag Tff7b72= Tffa657falseTb4b4b4;
Tff7b72static Tffa657bool Te6edf3serialGPSFlag Tff7b72= Tffa657falseTb4b4b4;
Tff7b72#Tff7b72ifndef TELEM_RAK12500_ADDRESS
Tff7b72#Tff7b72define TELEM_RAK12500_ADDRESS 0x42 T8b949e//RAK12500 Ublox GPS via i2c
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72include T8b949e<SparkFun_u-blox_GNSS_Arduino_Library.h>
Tff7b72static Te6edf3SFE_UBLOX_GNSS Te6edf3ublox_GNSSTb4b4b4;
Tff7b72class T56d364RAK12500LocationProvider Tff7b72: Tff7b72public Te6edf3LocationProvider Tb4b4b4{
Tffa657long Te6edf3_lat Tff7b72= T79c0ff0Tb4b4b4;
Tffa657long Te6edf3_lng Tff7b72= T79c0ff0Tb4b4b4;
Tffa657long Te6edf3_alt Tff7b72= T79c0ff0Tb4b4b4;
Tffa657int Te6edf3_sats Tff7b72= T79c0ff0Tb4b4b4;
Tffa657long Te6edf3_epoch Tff7b72= T79c0ff0Tb4b4b4;
Tffa657bool Te6edf3_fix Tff7b72= Tffa657falseTb4b4b4;
Tff7b72publicTff7b72:
Tffa657long Te6edf3getLatitudeTb4b4b4(Tb4b4b4) Tff7b72override Tb4b4b4{ Tff7b72return Te6edf3_latTb4b4b4; Tb4b4b4}
Tffa657long Te6edf3getLongitudeTb4b4b4(Tb4b4b4) Tff7b72override Tb4b4b4{ Tff7b72return Te6edf3_lngTb4b4b4; Tb4b4b4}
Tffa657long Te6edf3getAltitudeTb4b4b4(Tb4b4b4) Tff7b72override Tb4b4b4{ Tff7b72return Te6edf3_altTb4b4b4; Tb4b4b4}
Tffa657long Te6edf3satellitesCountTb4b4b4(Tb4b4b4) Tff7b72override Tb4b4b4{ Tff7b72return Te6edf3_satsTb4b4b4; Tb4b4b4}
Tffa657bool Te6edf3isValidTb4b4b4(Tb4b4b4) Tff7b72override Tb4b4b4{ Tff7b72return Te6edf3_fixTb4b4b4; Tb4b4b4}
Tffa657long Te6edf3getTimestampTb4b4b4(Tb4b4b4) Tff7b72override Tb4b4b4{ Tff7b72return Te6edf3_epochTb4b4b4; Tb4b4b4}
Tffa657void Te6edf3sendSentenceTb4b4b4(Tff7b72const Tffa657char Tff7b72* Te6edf3sentenceTb4b4b4) Tff7b72override Tb4b4b4{ Tb4b4b4}
Tffa657void Te6edf3resetTb4b4b4(Tb4b4b4) Tff7b72override Tb4b4b4{ Tb4b4b4}
Tffa657void Te6edf3beginTb4b4b4(Tb4b4b4) Tff7b72override Tb4b4b4{ Tb4b4b4}
Tffa657void Te6edf3stopTb4b4b4(Tb4b4b4) Tff7b72override Tb4b4b4{ Tb4b4b4}
Tffa657void Te6edf3loopTb4b4b4(Tb4b4b4) Tff7b72override Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3ublox_GNSSTb4b4b4.Te6edf3getGnssFixOkTb4b4b4(T79c0ff8Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3_fix Tff7b72= Tffa657trueTb4b4b4;
Te6edf3_lat Tff7b72= Te6edf3ublox_GNSSTb4b4b4.Te6edf3getLatitudeTb4b4b4(T79c0ff2Tb4b4b4) Tff7b72/ T79c0ff10Tb4b4b4;
Te6edf3_lng Tff7b72= Te6edf3ublox_GNSSTb4b4b4.Te6edf3getLongitudeTb4b4b4(T79c0ff2Tb4b4b4) Tff7b72/ T79c0ff10Tb4b4b4;
Te6edf3_alt Tff7b72= Te6edf3ublox_GNSSTb4b4b4.Te6edf3getAltitudeTb4b4b4(T79c0ff2Tb4b4b4)Tb4b4b4;
Te6edf3_sats Tff7b72= Te6edf3ublox_GNSSTb4b4b4.Te6edf3getSIVTb4b4b4(T79c0ff2Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3_fix Tff7b72= Tffa657falseTb4b4b4;
Tb4b4b4}
Te6edf3_epoch Tff7b72= Te6edf3ublox_GNSSTb4b4b4.Te6edf3getUnixEpochTb4b4b4(T79c0ff2Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657bool Te6edf3isEnabledTb4b4b4(Tb4b4b4) Tff7b72override Tb4b4b4{ Tff7b72return Tffa657trueTb4b4b4; Tb4b4b4}
Tb4b4b4}Tb4b4b4;
Tff7b72static Te6edf3RAK12500LocationProvider Te6edf3RAK12500_providerTb4b4b4;
Tff7b72#Tff7b72endif
T8b949e// ============================================================
T8b949e// I2C bus scanner
T8b949e// Probes every valid address and records which ones ACK.
T8b949e// This runs before any sensor library is touched, so a missing
T8b949e// or misbehaving device cannot stall or crash the boot sequence.
T8b949e// ============================================================
Tff7b72static Tffa657void Td2a8ffscanI2CBusTb4b4b4(Te6edf3TwoWireTff7b72* Te6edf3wireTb4b4b4, Tffa657bool Te6edf3foundTb4b4b4[T79c0ff128Tb4b4b4]Tb4b4b4) Tb4b4b4{
Tff7b72for Tb4b4b4(Tffa657uint8_t Te6edf3addr Tff7b72= T79c0ff0x08Tb4b4b4; Te6edf3addr Tff7b72< T79c0ff0x78Tb4b4b4; Te6edf3addrTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Te6edf3wireTff7b72-Tff7b72>Te6edf3beginTransmissionTb4b4b4(Te6edf3addrTb4b4b4)Tb4b4b4;
Te6edf3foundTb4b4b4[Te6edf3addrTb4b4b4] Tff7b72= Tb4b4b4(Te6edf3wireTff7b72-Tff7b72>Te6edf3endTransmissionTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= T79c0ff0Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
T8b949e// ============================================================
T8b949e// Per-sensor init and query functions
T8b949e//
T8b949e// init(wire, address) — called only when the address was seen
T8b949e// on the bus. Returns 0 on failure, or the number of
T8b949e// telemetry channels the sensor will consume (1 for all
T8b949e// single-output sensors; INA3221 returns one per enabled
T8b949e// hardware channel; MLX90614 and RAK12035+calibration
T8b949e// return 2).
T8b949e//
T8b949e// query(channel, sub_channel, lpp) — called once per active
T8b949e// sensor entry during querySensors(). sub_channel is always
T8b949e// 0 for single-output sensors.
T8b949e// ============================================================
Tff7b72#Tff7b72if ENV_INCLUDE_AHTX0
Tff7b72static Tffa657uint8_t Td2a8ffinit_ahtx0Tb4b4b4(Te6edf3TwoWireTff7b72* Te6edf3wireTb4b4b4, Tffa657uint8_t Te6edf3addrTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3AHTX0Tb4b4b4.Te6edf3beginTb4b4b4(Te6edf3wireTb4b4b4, T79c0ff0Tb4b4b4, Te6edf3addrTb4b4b4) Tff7b72? T79c0ff1 Tff7b72: T79c0ff0Tb4b4b4;
Tb4b4b4}
Tff7b72static Tffa657void Td2a8ffquery_ahtx0Tb4b4b4(Tffa657uint8_t Te6edf3chTb4b4b4, Tffa657uint8_tTb4b4b4, Te6edf3CayenneLPPTff7b72& Te6edf3lppTb4b4b4) Tb4b4b4{
Te6edf3sensors_event_t Te6edf3humidityTb4b4b4, Te6edf3tempTb4b4b4;
Te6edf3AHTX0Tb4b4b4.Te6edf3getEventTb4b4b4(Tff7b72&Te6edf3humidityTb4b4b4, Tff7b72&Te6edf3tempTb4b4b4)Tb4b4b4;
Te6edf3lppTb4b4b4.Te6edf3addTemperatureTb4b4b4(Te6edf3chTb4b4b4, Te6edf3tempTb4b4b4.Te6edf3temperatureTb4b4b4)Tb4b4b4;
Te6edf3lppTb4b4b4.Te6edf3addRelativeHumidityTb4b4b4(Te6edf3chTb4b4b4, Te6edf3humidityTb4b4b4.Te6edf3relative_humidityTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72ifdef ENV_INCLUDE_BME680
Tff7b72static Tffa657uint8_t Td2a8ffinit_bme680Tb4b4b4(Te6edf3TwoWireTff7b72*Tb4b4b4, Tffa657uint8_t Te6edf3addrTb4b4b4) Tb4b4b4{
T8b949e// Wire was set in the static constructor; begin() takes address only.
Tff7b72return Te6edf3BME680Tb4b4b4.Te6edf3beginTb4b4b4(Te6edf3addrTb4b4b4) Tff7b72? T79c0ff1 Tff7b72: T79c0ff0Tb4b4b4;
Tb4b4b4}
Tff7b72static Tffa657void Td2a8ffquery_bme680Tb4b4b4(Tffa657uint8_t Te6edf3chTb4b4b4, Tffa657uint8_tTb4b4b4, Te6edf3CayenneLPPTff7b72& Te6edf3lppTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3BME680Tb4b4b4.Te6edf3performReadingTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3lppTb4b4b4.Te6edf3addTemperatureTb4b4b4(Te6edf3chTb4b4b4, Te6edf3BME680Tb4b4b4.Te6edf3temperatureTb4b4b4)Tb4b4b4;
Te6edf3lppTb4b4b4.Te6edf3addRelativeHumidityTb4b4b4(Te6edf3chTb4b4b4, Te6edf3BME680Tb4b4b4.Te6edf3humidityTb4b4b4)Tb4b4b4;
Tff7b72const Tffa657float Te6edf3pressure_hpa Tff7b72= Te6edf3BME680Tb4b4b4.Te6edf3pressure Tff7b72/ T79c0ff100.0fTb4b4b4;
Te6edf3lppTb4b4b4.Te6edf3addBarometricPressureTb4b4b4(Te6edf3chTb4b4b4, Te6edf3pressure_hpaTb4b4b4)Tb4b4b4;
Te6edf3lppTb4b4b4.Te6edf3addAltitudeTb4b4b4(Te6edf3chTb4b4b4, T79c0ff44330.0f Tff7b72* Tb4b4b4(T79c0ff1.0f Tff7b72- Te6edf3powfTb4b4b4(Te6edf3pressure_hpa Tff7b72/ Tb4b4b4(Tffa657floatTb4b4b4)Te6edf3TELEM_BME680_SEALEVELPRESSURE_HPATb4b4b4, T79c0ff0.1903fTb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3lppTb4b4b4.Te6edf3addGenericSensorTb4b4b4(Te6edf3chTb4b4b4, Te6edf3BME680Tb4b4b4.Te6edf3gas_resistanceTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if ENV_INCLUDE_BME280
Tff7b72static Tffa657uint8_t Td2a8ffinit_bme280Tb4b4b4(Te6edf3TwoWireTff7b72* Te6edf3wireTb4b4b4, Tffa657uint8_t Te6edf3addrTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3BME280Tb4b4b4.Te6edf3beginTb4b4b4(Te6edf3addrTb4b4b4, Te6edf3wireTb4b4b4)Tb4b4b4) Tff7b72return T79c0ff0Tb4b4b4;
Te6edf3BME280Tb4b4b4.Te6edf3setSamplingTb4b4b4(Te6edf3Adafruit_BME280Tff7b72:Tff7b72:Te6edf3MODE_FORCEDTb4b4b4,
Te6edf3Adafruit_BME280Tff7b72:Tff7b72:Te6edf3SAMPLING_X1Tb4b4b4,
Te6edf3Adafruit_BME280Tff7b72:Tff7b72:Te6edf3SAMPLING_X1Tb4b4b4,
Te6edf3Adafruit_BME280Tff7b72:Tff7b72:Te6edf3SAMPLING_X1Tb4b4b4,
Te6edf3Adafruit_BME280Tff7b72:Tff7b72:Te6edf3FILTER_OFFTb4b4b4,
Te6edf3Adafruit_BME280Tff7b72:Tff7b72:Te6edf3STANDBY_MS_1000Tb4b4b4)Tb4b4b4;
Tff7b72return T79c0ff1Tb4b4b4;
Tb4b4b4}
Tff7b72static Tffa657void Td2a8ffquery_bme280Tb4b4b4(Tffa657uint8_t Te6edf3chTb4b4b4, Tffa657uint8_tTb4b4b4, Te6edf3CayenneLPPTff7b72& Te6edf3lppTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3BME280Tb4b4b4.Te6edf3takeForcedMeasurementTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3lppTb4b4b4.Te6edf3addTemperatureTb4b4b4(Te6edf3chTb4b4b4, Te6edf3BME280Tb4b4b4.Te6edf3readTemperatureTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3lppTb4b4b4.Te6edf3addRelativeHumidityTb4b4b4(Te6edf3chTb4b4b4, Te6edf3BME280Tb4b4b4.Te6edf3readHumidityTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3lppTb4b4b4.Te6edf3addBarometricPressureTb4b4b4(Te6edf3chTb4b4b4, Te6edf3BME280Tb4b4b4.Te6edf3readPressureTb4b4b4(Tb4b4b4) Tff7b72/ T79c0ff100Tb4b4b4)Tb4b4b4;
Te6edf3lppTb4b4b4.Te6edf3addAltitudeTb4b4b4(Te6edf3chTb4b4b4, Te6edf3BME280Tb4b4b4.Te6edf3readAltitudeTb4b4b4(Te6edf3TELEM_BME280_SEALEVELPRESSURE_HPATb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if ENV_INCLUDE_BMP280
Tff7b72static Tffa657uint8_t Td2a8ffinit_bmp280Tb4b4b4(Te6edf3TwoWireTff7b72*Tb4b4b4, Tffa657uint8_t Te6edf3addrTb4b4b4) Tb4b4b4{
T8b949e// BMP280 static instance was constructed with TELEM_WIRE; begin() uses it.
Tff7b72return Te6edf3BMP280Tb4b4b4.Te6edf3beginTb4b4b4(Te6edf3addrTb4b4b4) Tff7b72? T79c0ff1 Tff7b72: T79c0ff0Tb4b4b4;
Tb4b4b4}
Tff7b72static Tffa657void Td2a8ffquery_bmp280Tb4b4b4(Tffa657uint8_t Te6edf3chTb4b4b4, Tffa657uint8_tTb4b4b4, Te6edf3CayenneLPPTff7b72& Te6edf3lppTb4b4b4) Tb4b4b4{
Te6edf3lppTb4b4b4.Te6edf3addTemperatureTb4b4b4(Te6edf3chTb4b4b4, Te6edf3BMP280Tb4b4b4.Te6edf3readTemperatureTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3lppTb4b4b4.Te6edf3addBarometricPressureTb4b4b4(Te6edf3chTb4b4b4, Te6edf3BMP280Tb4b4b4.Te6edf3readPressureTb4b4b4(Tb4b4b4) Tff7b72/ T79c0ff100Tb4b4b4)Tb4b4b4;
Te6edf3lppTb4b4b4.Te6edf3addAltitudeTb4b4b4(Te6edf3chTb4b4b4, Te6edf3BMP280Tb4b4b4.Te6edf3readAltitudeTb4b4b4(Te6edf3TELEM_BMP280_SEALEVELPRESSURE_HPATb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if ENV_INCLUDE_SHTC3
Tff7b72static Tffa657uint8_t Td2a8ffinit_shtc3Tb4b4b4(Te6edf3TwoWireTff7b72* Te6edf3wireTb4b4b4, Tffa657uint8_tTb4b4b4) Tb4b4b4{
T8b949e// Adafruit_SHTC3::begin() does not accept an address (fixed at 0x70).
Tff7b72return Te6edf3SHTC3Tb4b4b4.Te6edf3beginTb4b4b4(Te6edf3wireTb4b4b4) Tff7b72? T79c0ff1 Tff7b72: T79c0ff0Tb4b4b4;
Tb4b4b4}
Tff7b72static Tffa657void Td2a8ffquery_shtc3Tb4b4b4(Tffa657uint8_t Te6edf3chTb4b4b4, Tffa657uint8_tTb4b4b4, Te6edf3CayenneLPPTff7b72& Te6edf3lppTb4b4b4) Tb4b4b4{
Te6edf3sensors_event_t Te6edf3humidityTb4b4b4, Te6edf3tempTb4b4b4;
Te6edf3SHTC3Tb4b4b4.Te6edf3getEventTb4b4b4(Tff7b72&Te6edf3humidityTb4b4b4, Tff7b72&Te6edf3tempTb4b4b4)Tb4b4b4;
Te6edf3lppTb4b4b4.Te6edf3addTemperatureTb4b4b4(Te6edf3chTb4b4b4, Te6edf3tempTb4b4b4.Te6edf3temperatureTb4b4b4)Tb4b4b4;
Te6edf3lppTb4b4b4.Te6edf3addRelativeHumidityTb4b4b4(Te6edf3chTb4b4b4, Te6edf3humidityTb4b4b4.Te6edf3relative_humidityTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if ENV_INCLUDE_SHT4X
Tff7b72static Tffa657uint8_t Td2a8ffinit_sht4xTb4b4b4(Te6edf3TwoWireTff7b72* Te6edf3wireTb4b4b4, Tffa657uint8_t Te6edf3addrTb4b4b4) Tb4b4b4{
T8b949e// SensirionI2cSht4x::begin() does not probe the hardware; use serialNumber()
T8b949e// as the actual presence check since it performs a real I2C transaction.
Te6edf3SHT4XTb4b4b4.Te6edf3beginTb4b4b4(Tff7b72*Te6edf3wireTb4b4b4, Te6edf3addrTb4b4b4)Tb4b4b4;
Tffa657uint32_t Te6edf3serial Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72return Tb4b4b4(Te6edf3SHT4XTb4b4b4.Te6edf3serialNumberTb4b4b4(Te6edf3serialTb4b4b4) Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Tff7b72? T79c0ff1 Tff7b72: T79c0ff0Tb4b4b4;
Tb4b4b4}
Tff7b72static Tffa657void Td2a8ffquery_sht4xTb4b4b4(Tffa657uint8_t Te6edf3chTb4b4b4, Tffa657uint8_tTb4b4b4, Te6edf3CayenneLPPTff7b72& Te6edf3lppTb4b4b4) Tb4b4b4{
Tffa657float Te6edf3temperatureTb4b4b4, Te6edf3humidityTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3SHT4XTb4b4b4.Te6edf3measureLowestPrecisionTb4b4b4(Te6edf3temperatureTb4b4b4, Te6edf3humidityTb4b4b4) Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3lppTb4b4b4.Te6edf3addTemperatureTb4b4b4(Te6edf3chTb4b4b4, Te6edf3temperatureTb4b4b4)Tb4b4b4;
Te6edf3lppTb4b4b4.Te6edf3addRelativeHumidityTb4b4b4(Te6edf3chTb4b4b4, Te6edf3humidityTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if ENV_INCLUDE_LPS22HB
Tff7b72static Tffa657uint8_t Td2a8ffinit_lps22hbTb4b4b4(Te6edf3TwoWireTff7b72*Tb4b4b4, Tffa657uint8_tTb4b4b4) Tb4b4b4{
T8b949e// LPS22HBClass is constructed with the wire reference; begin() uses it.
Tff7b72return Te6edf3LPS22HBTb4b4b4.Te6edf3beginTb4b4b4(Tb4b4b4) Tff7b72? T79c0ff1 Tff7b72: T79c0ff0Tb4b4b4;
Tb4b4b4}
Tff7b72static Tffa657void Td2a8ffquery_lps22hbTb4b4b4(Tffa657uint8_t Te6edf3chTb4b4b4, Tffa657uint8_tTb4b4b4, Te6edf3CayenneLPPTff7b72& Te6edf3lppTb4b4b4) Tb4b4b4{
Te6edf3lppTb4b4b4.Te6edf3addTemperatureTb4b4b4(Te6edf3chTb4b4b4, Te6edf3LPS22HBTb4b4b4.Te6edf3readTemperatureTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3lppTb4b4b4.Te6edf3addBarometricPressureTb4b4b4(Te6edf3chTb4b4b4, Te6edf3LPS22HBTb4b4b4.Te6edf3readPressureTb4b4b4(Tb4b4b4) Tff7b72* T79c0ff10Tb4b4b4)Tb4b4b4; T8b949e// convert kPa to hPa
Tb4b4b4}
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if ENV_INCLUDE_INA3221
Tff7b72static Tffa657uint8_t Td2a8ffinit_ina3221Tb4b4b4(Te6edf3TwoWireTff7b72* Te6edf3wireTb4b4b4, Tffa657uint8_t Te6edf3addrTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3INA3221Tb4b4b4.Te6edf3beginTb4b4b4(Te6edf3addrTb4b4b4, Te6edf3wireTb4b4b4)Tb4b4b4) Tff7b72return T79c0ff0Tb4b4b4;
Tff7b72for Tb4b4b4(Tffa657int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3TELEM_INA3221_NUM_CHANNELSTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Te6edf3INA3221Tb4b4b4.Te6edf3setShuntResistanceTb4b4b4(Te6edf3iTb4b4b4, Te6edf3TELEM_INA3221_SHUNT_VALUETb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e// Each enabled hardware channel becomes its own telemetry channel.
Tffa657uint8_t Te6edf3enabled Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72for Tb4b4b4(Tffa657int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3TELEM_INA3221_NUM_CHANNELSTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3INA3221Tb4b4b4.Te6edf3isChannelEnabledTb4b4b4(Te6edf3iTb4b4b4)Tb4b4b4) Te6edf3enabledTff7b72+Tff7b72+Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3enabled Tff7b72> T79c0ff0 Tff7b72? Te6edf3enabled Tff7b72: T79c0ff1Tb4b4b4;
Tb4b4b4}
Tff7b72static Tffa657void Td2a8ffquery_ina3221Tb4b4b4(Tffa657uint8_t Te6edf3chTb4b4b4, Tffa657uint8_t Te6edf3sub_chTb4b4b4, Te6edf3CayenneLPPTff7b72& Te6edf3lppTb4b4b4) Tb4b4b4{
T8b949e// sub_ch is the index of the nth enabled hardware channel.
Tffa657uint8_t Te6edf3seen Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72for Tb4b4b4(Tffa657int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3TELEM_INA3221_NUM_CHANNELSTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3INA3221Tb4b4b4.Te6edf3isChannelEnabledTb4b4b4(Te6edf3iTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3seen Tff7b72=Tff7b72= Te6edf3sub_chTb4b4b4) Tb4b4b4{
Tffa657float Te6edf3v Tff7b72= Te6edf3INA3221Tb4b4b4.Te6edf3getBusVoltageTb4b4b4(Te6edf3iTb4b4b4)Tb4b4b4;
Tffa657float Te6edf3c Tff7b72= Te6edf3INA3221Tb4b4b4.Te6edf3getCurrentAmpsTb4b4b4(Te6edf3iTb4b4b4)Tb4b4b4;
Te6edf3lppTb4b4b4.Te6edf3addVoltageTb4b4b4(Te6edf3chTb4b4b4, Te6edf3vTb4b4b4)Tb4b4b4;
Te6edf3lppTb4b4b4.Te6edf3addCurrentTb4b4b4(Te6edf3chTb4b4b4, Te6edf3cTb4b4b4)Tb4b4b4;
Te6edf3lppTb4b4b4.Te6edf3addPowerTb4b4b4(Te6edf3chTb4b4b4, Te6edf3v Tff7b72* Te6edf3cTb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Te6edf3seenTff7b72+Tff7b72+Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if ENV_INCLUDE_INA219
Tff7b72static Tffa657uint8_t Td2a8ffinit_ina219Tb4b4b4(Te6edf3TwoWireTff7b72* Te6edf3wireTb4b4b4, Tffa657uint8_tTb4b4b4) Tb4b4b4{
T8b949e// INA219 static instance was constructed with the address; begin() uses it.
Tff7b72return Te6edf3INA219Tb4b4b4.Te6edf3beginTb4b4b4(Te6edf3wireTb4b4b4) Tff7b72? T79c0ff1 Tff7b72: T79c0ff0Tb4b4b4;
Tb4b4b4}
Tff7b72static Tffa657void Td2a8ffquery_ina219Tb4b4b4(Tffa657uint8_t Te6edf3chTb4b4b4, Tffa657uint8_tTb4b4b4, Te6edf3CayenneLPPTff7b72& Te6edf3lppTb4b4b4) Tb4b4b4{
Te6edf3lppTb4b4b4.Te6edf3addVoltageTb4b4b4(Te6edf3chTb4b4b4, Te6edf3INA219Tb4b4b4.Te6edf3getBusVoltage_VTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3lppTb4b4b4.Te6edf3addCurrentTb4b4b4(Te6edf3chTb4b4b4, Te6edf3INA219Tb4b4b4.Te6edf3getCurrent_mATb4b4b4(Tb4b4b4) Tff7b72/ T79c0ff1000.0fTb4b4b4)Tb4b4b4;
Te6edf3lppTb4b4b4.Te6edf3addPowerTb4b4b4(Te6edf3chTb4b4b4, Te6edf3INA219Tb4b4b4.Te6edf3getPower_mWTb4b4b4(Tb4b4b4) Tff7b72/ T79c0ff1000.0fTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if ENV_INCLUDE_INA260
Tff7b72static Tffa657uint8_t Td2a8ffinit_ina260Tb4b4b4(Te6edf3TwoWireTff7b72* Te6edf3wireTb4b4b4, Tffa657uint8_t Te6edf3addrTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3INA260Tb4b4b4.Te6edf3beginTb4b4b4(Te6edf3addrTb4b4b4, Te6edf3wireTb4b4b4) Tff7b72? T79c0ff1 Tff7b72: T79c0ff0Tb4b4b4;
Tb4b4b4}
Tff7b72static Tffa657void Td2a8ffquery_ina260Tb4b4b4(Tffa657uint8_t Te6edf3chTb4b4b4, Tffa657uint8_tTb4b4b4, Te6edf3CayenneLPPTff7b72& Te6edf3lppTb4b4b4) Tb4b4b4{
Te6edf3lppTb4b4b4.Te6edf3addVoltageTb4b4b4(Te6edf3chTb4b4b4, Te6edf3INA260Tb4b4b4.Te6edf3readBusVoltageTb4b4b4(Tb4b4b4) Tff7b72/ T79c0ff1000.0fTb4b4b4)Tb4b4b4;
Te6edf3lppTb4b4b4.Te6edf3addCurrentTb4b4b4(Te6edf3chTb4b4b4, Te6edf3INA260Tb4b4b4.Te6edf3readCurrentTb4b4b4(Tb4b4b4) Tff7b72/ T79c0ff1000.0fTb4b4b4)Tb4b4b4;
Te6edf3lppTb4b4b4.Te6edf3addPowerTb4b4b4(Te6edf3chTb4b4b4, Te6edf3INA260Tb4b4b4.Te6edf3readPowerTb4b4b4(Tb4b4b4) Tff7b72/ T79c0ff1000.0fTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if ENV_INCLUDE_INA226
Tff7b72static Tffa657uint8_t Td2a8ffinit_ina226Tb4b4b4(Te6edf3TwoWireTff7b72*Tb4b4b4, Tffa657uint8_tTb4b4b4) Tb4b4b4{
T8b949e// INA226 static instance was constructed with address and wire.
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3INA226Tb4b4b4.Te6edf3beginTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72return T79c0ff0Tb4b4b4;
Te6edf3INA226Tb4b4b4.Te6edf3setMaxCurrentShuntTb4b4b4(Te6edf3TELEM_INA226_MAX_AMPTb4b4b4, Te6edf3TELEM_INA226_SHUNT_VALUETb4b4b4)Tb4b4b4;
Tff7b72return T79c0ff1Tb4b4b4;
Tb4b4b4}
Tff7b72static Tffa657void Td2a8ffquery_ina226Tb4b4b4(Tffa657uint8_t Te6edf3chTb4b4b4, Tffa657uint8_tTb4b4b4, Te6edf3CayenneLPPTff7b72& Te6edf3lppTb4b4b4) Tb4b4b4{
Te6edf3lppTb4b4b4.Te6edf3addVoltageTb4b4b4(Te6edf3chTb4b4b4, Te6edf3INA226Tb4b4b4.Te6edf3getBusVoltageTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3lppTb4b4b4.Te6edf3addCurrentTb4b4b4(Te6edf3chTb4b4b4, Te6edf3INA226Tb4b4b4.Te6edf3getCurrent_mATb4b4b4(Tb4b4b4) Tff7b72/ T79c0ff1000.0fTb4b4b4)Tb4b4b4;
Te6edf3lppTb4b4b4.Te6edf3addPowerTb4b4b4(Te6edf3chTb4b4b4, Te6edf3INA226Tb4b4b4.Te6edf3getPower_mWTb4b4b4(Tb4b4b4) Tff7b72/ T79c0ff1000.0fTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if ENV_INCLUDE_MLX90614
Tff7b72static Tffa657uint8_t Td2a8ffinit_mlx90614Tb4b4b4(Te6edf3TwoWireTff7b72* Te6edf3wireTb4b4b4, Tffa657uint8_t Te6edf3addrTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3MLX90614Tb4b4b4.Te6edf3beginTb4b4b4(Te6edf3addrTb4b4b4, Te6edf3wireTb4b4b4) Tff7b72? T79c0ff2 Tff7b72: T79c0ff0Tb4b4b4; T8b949e// 2 channels: object temp, ambient temp
Tb4b4b4}
Tff7b72static Tffa657void Td2a8ffquery_mlx90614Tb4b4b4(Tffa657uint8_t Te6edf3chTb4b4b4, Tffa657uint8_t Te6edf3sub_chTb4b4b4, Te6edf3CayenneLPPTff7b72& Te6edf3lppTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3sub_ch Tff7b72=Tff7b72= T79c0ff0Tb4b4b4)
Te6edf3lppTb4b4b4.Te6edf3addTemperatureTb4b4b4(Te6edf3chTb4b4b4, Te6edf3MLX90614Tb4b4b4.Te6edf3readObjectTempCTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72else
Te6edf3lppTb4b4b4.Te6edf3addTemperatureTb4b4b4(Te6edf3chTb4b4b4, Te6edf3MLX90614Tb4b4b4.Te6edf3readAmbientTempCTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if ENV_INCLUDE_VL53L0X
Tff7b72static Tffa657uint8_t Td2a8ffinit_vl53l0xTb4b4b4(Te6edf3TwoWireTff7b72* Te6edf3wireTb4b4b4, Tffa657uint8_t Te6edf3addrTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3VL53L0XTb4b4b4.Te6edf3beginTb4b4b4(Te6edf3addrTb4b4b4, Tffa657falseTb4b4b4, Te6edf3wireTb4b4b4) Tff7b72? T79c0ff1 Tff7b72: T79c0ff0Tb4b4b4;
Tb4b4b4}
Tff7b72static Tffa657void Td2a8ffquery_vl53l0xTb4b4b4(Tffa657uint8_t Te6edf3chTb4b4b4, Tffa657uint8_tTb4b4b4, Te6edf3CayenneLPPTff7b72& Te6edf3lppTb4b4b4) Tb4b4b4{
Te6edf3VL53L0X_RangingMeasurementData_t Te6edf3measureTb4b4b4;
Te6edf3VL53L0XTb4b4b4.Te6edf3rangingTestTb4b4b4(Tff7b72&Te6edf3measureTb4b4b4, Tffa657falseTb4b4b4)Tb4b4b4;
Te6edf3lppTb4b4b4.Te6edf3addDistanceTb4b4b4(Te6edf3chTb4b4b4, Te6edf3measureTb4b4b4.Te6edf3RangeStatus Tff7b72!Tff7b72= T79c0ff4 Tff7b72? Te6edf3measureTb4b4b4.Te6edf3RangeMilliMeter Tff7b72/ T79c0ff1000.0f Tff7b72: T79c0ff0.0fTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72ifdef ENV_INCLUDE_BMP085
Tff7b72static Tffa657uint8_t Td2a8ffinit_bmp085Tb4b4b4(Te6edf3TwoWireTff7b72* Te6edf3wireTb4b4b4, Tffa657uint8_tTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3BMP085Tb4b4b4.Te6edf3beginTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3wireTb4b4b4) Tff7b72? T79c0ff1 Tff7b72: T79c0ff0Tb4b4b4; T8b949e// mode 0 = ULTRALOWPOWER
Tb4b4b4}
Tff7b72static Tffa657void Td2a8ffquery_bmp085Tb4b4b4(Tffa657uint8_t Te6edf3chTb4b4b4, Tffa657uint8_tTb4b4b4, Te6edf3CayenneLPPTff7b72& Te6edf3lppTb4b4b4) Tb4b4b4{
Te6edf3lppTb4b4b4.Te6edf3addTemperatureTb4b4b4(Te6edf3chTb4b4b4, Te6edf3BMP085Tb4b4b4.Te6edf3readTemperatureTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3lppTb4b4b4.Te6edf3addBarometricPressureTb4b4b4(Te6edf3chTb4b4b4, Te6edf3BMP085Tb4b4b4.Te6edf3readPressureTb4b4b4(Tb4b4b4) Tff7b72/ T79c0ff100Tb4b4b4)Tb4b4b4;
Te6edf3lppTb4b4b4.Te6edf3addAltitudeTb4b4b4(Te6edf3chTb4b4b4, Te6edf3BMP085Tb4b4b4.Te6edf3readAltitudeTb4b4b4(Te6edf3TELEM_BMP085_SEALEVELPRESSURE_HPA Tff7b72* T79c0ff100Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if ENV_INCLUDE_RAK12035
Tff7b72static Tffa657uint8_t Td2a8ffinit_rak12035Tb4b4b4(Te6edf3TwoWireTff7b72* Te6edf3wireTb4b4b4, Tffa657uint8_t Te6edf3addrTb4b4b4) Tb4b4b4{
T8b949e// RAK12035 requires setup() before begin().
Te6edf3RAK12035Tb4b4b4.Te6edf3setupTb4b4b4(Tff7b72*Te6edf3wireTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3RAK12035Tb4b4b4.Te6edf3beginTb4b4b4(Te6edf3addrTb4b4b4)Tb4b4b4) Tff7b72return T79c0ff0Tb4b4b4;
Tff7b72#Tff7b72ifdef ENABLE_RAK12035_CALIBRATION
Tff7b72return T79c0ff2Tb4b4b4; T8b949e// moisture channel + calibration channel
Tff7b72#Tff7b72else
Tff7b72return T79c0ff1Tb4b4b4;
Tff7b72#Tff7b72endif
Tb4b4b4}
Tff7b72static Tffa657void Td2a8ffquery_rak12035Tb4b4b4(Tffa657uint8_t Te6edf3chTb4b4b4, Tffa657uint8_t Te6edf3sub_chTb4b4b4, Te6edf3CayenneLPPTff7b72& Te6edf3lppTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3sub_ch Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3lppTb4b4b4.Te6edf3addTemperatureTb4b4b4(Te6edf3chTb4b4b4, Te6edf3RAK12035Tb4b4b4.Te6edf3get_sensor_temperatureTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3lppTb4b4b4.Te6edf3addPercentageTb4b4b4(Te6edf3chTb4b4b4, Te6edf3RAK12035Tb4b4b4.Te6edf3get_sensor_moistureTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72#Tff7b72ifdef ENABLE_RAK12035_CALIBRATION
Tffa657float Te6edf3cap Tff7b72= Te6edf3RAK12035Tb4b4b4.Te6edf3get_sensor_capacitanceTb4b4b4(Tb4b4b4)Tb4b4b4;
Tffa657float Te6edf3wet Tff7b72= Te6edf3RAK12035Tb4b4b4.Te6edf3get_humidity_fullTb4b4b4(Tb4b4b4)Tb4b4b4;
Tffa657float Te6edf3dry Tff7b72= Te6edf3RAK12035Tb4b4b4.Te6edf3get_humidity_zeroTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3lppTb4b4b4.Te6edf3addFrequencyTb4b4b4(Te6edf3chTb4b4b4, Te6edf3capTb4b4b4)Tb4b4b4;
Te6edf3lppTb4b4b4.Te6edf3addTemperatureTb4b4b4(Te6edf3chTb4b4b4, Te6edf3wetTb4b4b4)Tb4b4b4;
Te6edf3lppTb4b4b4.Te6edf3addPowerTb4b4b4(Te6edf3chTb4b4b4, Te6edf3dryTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3cap Tff7b72> Te6edf3dryTb4b4b4) Te6edf3RAK12035Tb4b4b4.Te6edf3set_humidity_zeroTb4b4b4(Te6edf3capTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3cap Tff7b72< Te6edf3wetTb4b4b4) Te6edf3RAK12035Tb4b4b4.Te6edf3set_humidity_fullTb4b4b4(Te6edf3capTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tb4b4b4}
Tb4b4b4}
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if ENV_INCLUDE_BME680_BSEC
Tff7b72static Tffa657void Td2a8ffbsec_load_stateTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72using Tff7b72namespace T7ee787Adafruit_LittleFS_NamespaceTb4b4b4;
Te6edf3File Te6edf3f Tff7b72= Te6edf3InternalFSTb4b4b4.Te6edf3openTb4b4b4(Te6edf3BSEC_STATE_FILETb4b4b4, Te6edf3FILE_O_READTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3fTb4b4b4) Tff7b72returnTb4b4b4;
Tffa657uint8_t Te6edf3stateTb4b4b4[Te6edf3BSEC_MAX_STATE_BLOB_SIZETb4b4b4]Tb4b4b4;
Te6edf3fTb4b4b4.Te6edf3readTb4b4b4(Te6edf3stateTb4b4b4, Te6edf3BSEC_MAX_STATE_BLOB_SIZETb4b4b4)Tb4b4b4;
Te6edf3fTb4b4b4.Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3bsec_iaqTb4b4b4.Te6edf3setStateTb4b4b4(Te6edf3stateTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72static Tffa657void Te6edf3bsec_save_stateTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72using Tff7b72namespace T7ee787Adafruit_LittleFS_NamespaceTb4b4b4;
Tffa657uint8_t Te6edf3stateTb4b4b4[Te6edf3BSEC_MAX_STATE_BLOB_SIZETb4b4b4]Tb4b4b4;
Te6edf3bsec_iaqTb4b4b4.Te6edf3getStateTb4b4b4(Te6edf3stateTb4b4b4)Tb4b4b4;
Te6edf3InternalFSTb4b4b4.Te6edf3removeTb4b4b4(Te6edf3BSEC_STATE_FILETb4b4b4)Tb4b4b4;
Te6edf3File Te6edf3f Tff7b72= Te6edf3InternalFSTb4b4b4.Te6edf3openTb4b4b4(Te6edf3BSEC_STATE_FILETb4b4b4, Te6edf3FILE_O_WRITETb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3fTb4b4b4) Tff7b72returnTb4b4b4;
Te6edf3fTb4b4b4.Te6edf3writeTb4b4b4(Te6edf3stateTb4b4b4, Te6edf3BSEC_MAX_STATE_BLOB_SIZETb4b4b4)Tb4b4b4;
Te6edf3fTb4b4b4.Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72static Tffa657uint8_t Te6edf3init_bme680_bsecTb4b4b4(Te6edf3TwoWireTff7b72* Te6edf3wireTb4b4b4, Tffa657uint8_t Te6edf3addrTb4b4b4) Tb4b4b4{
Te6edf3bsec_iaqTb4b4b4.Te6edf3beginTb4b4b4(Te6edf3addrTb4b4b4, Tff7b72*Te6edf3wireTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3bsec_iaqTb4b4b4.Te6edf3bsecStatus Tff7b72!Tff7b72= Te6edf3BSEC_OKTb4b4b4) Tff7b72return T79c0ff0Tb4b4b4;
Te6edf3bsec_iaqTb4b4b4.Te6edf3setConfigTb4b4b4(Te6edf3bsec_config_iaqTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3bsec_iaqTb4b4b4.Te6edf3bsecStatus Tff7b72!Tff7b72= Te6edf3BSEC_OKTb4b4b4) Tff7b72return T79c0ff0Tb4b4b4;
Te6edf3bsec_virtual_sensor_t Te6edf3outputsTb4b4b4[Tb4b4b4] Tff7b72= Tb4b4b4{
Te6edf3BSEC_OUTPUT_IAQTb4b4b4,
Te6edf3BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURETb4b4b4,
Te6edf3BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITYTb4b4b4,
Te6edf3BSEC_OUTPUT_RAW_PRESSURETb4b4b4,
Te6edf3BSEC_OUTPUT_STABILIZATION_STATUSTb4b4b4,
Te6edf3BSEC_OUTPUT_RUN_IN_STATUSTb4b4b4,
Tb4b4b4}Tb4b4b4;
Te6edf3bsec_iaqTb4b4b4.Te6edf3updateSubscriptionTb4b4b4(Te6edf3outputsTb4b4b4, T79c0ff6Tb4b4b4, Te6edf3BSEC_SAMPLE_RATE_LPTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3bsec_iaqTb4b4b4.Te6edf3bsecStatus Tff7b72!Tff7b72= Te6edf3BSEC_OKTb4b4b4) Tff7b72return T79c0ff0Tb4b4b4;
Te6edf3bsec_load_stateTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3bsec_active Tff7b72= Tffa657trueTb4b4b4;
Tff7b72return T79c0ff1Tb4b4b4;
Tb4b4b4}
Tff7b72static Tffa657void Te6edf3query_bme680_bsecTb4b4b4(Tffa657uint8_t Te6edf3chTb4b4b4, Tffa657uint8_tTb4b4b4, Te6edf3CayenneLPPTff7b72& Te6edf3lppTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3bsec_data_readyTb4b4b4) Tff7b72returnTb4b4b4;
Te6edf3lppTb4b4b4.Te6edf3addTemperatureTb4b4b4(Te6edf3chTb4b4b4, Te6edf3bsec_temperatureTb4b4b4)Tb4b4b4;
Te6edf3lppTb4b4b4.Te6edf3addRelativeHumidityTb4b4b4(Te6edf3chTb4b4b4, Te6edf3bsec_humidityTb4b4b4)Tb4b4b4;
Te6edf3lppTb4b4b4.Te6edf3addBarometricPressureTb4b4b4(Te6edf3chTb4b4b4, Te6edf3bsec_pressure_hpaTb4b4b4)Tb4b4b4;
Te6edf3lppTb4b4b4.Te6edf3addAltitudeTb4b4b4(Te6edf3chTb4b4b4, T79c0ff44330.0f Tff7b72* Tb4b4b4(T79c0ff1.0f Tff7b72- Te6edf3powfTb4b4b4(Te6edf3bsec_pressure_hpa Tff7b72/ Tb4b4b4(Tffa657floatTb4b4b4)Te6edf3TELEM_BME680_SEALEVELPRESSURE_HPATb4b4b4, T79c0ff0.1903fTb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3lppTb4b4b4.Te6edf3addGenericSensorTb4b4b4(Te6edf3chTb4b4b4, Tb4b4b4(Tffa657uint16_tTb4b4b4)Te6edf3bsec_iaq_valTb4b4b4)Tb4b4b4;
Te6edf3lppTb4b4b4.Te6edf3addAnalogInputTb4b4b4(Te6edf3chTb4b4b4, Tb4b4b4(Tffa657floatTb4b4b4)Te6edf3bsec_accuracyTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
T8b949e// ============================================================
T8b949e// Sensor descriptor table
T8b949e//
T8b949e// Each entry maps an I2C address to a sensor's init and query
T8b949e// functions. Only entries whose ENV_INCLUDE_* guard is defined
T8b949e// are compiled in. The sentinel at the end keeps the array
T8b949e// non-empty regardless of which sensors are enabled.
T8b949e//
T8b949e// Ordering here determines channel assignment at runtime:
T8b949e// the first detected+initialized sensor gets channel 2, the
T8b949e// next gets channel 3, and so on.
T8b949e// ============================================================
Tff7b72struct T56d364SensorDef Tb4b4b4{
Tffa657uint8_t Te6edf3addressTb4b4b4;
Tff7b72const Tffa657charTff7b72* Te6edf3nameTb4b4b4;
Tffa657uint8_t Tb4b4b4(Tff7b72*Te6edf3initTb4b4b4)Tb4b4b4(Te6edf3TwoWireTff7b72* Te6edf3wireTb4b4b4, Tffa657uint8_t Te6edf3addressTb4b4b4)Tb4b4b4;
Tffa657void Tb4b4b4(Tff7b72*Te6edf3queryTb4b4b4)Tb4b4b4(Tffa657uint8_t Te6edf3channelTb4b4b4, Tffa657uint8_t Te6edf3sub_channelTb4b4b4, Te6edf3CayenneLPPTff7b72& Te6edf3telemetryTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4;
Tff7b72static Tff7b72const Te6edf3SensorDef Te6edf3SENSOR_TABLETb4b4b4[Tb4b4b4] Tff7b72= Tb4b4b4{
Tff7b72#Tff7b72if ENV_INCLUDE_AHTX0
Tb4b4b4{ Te6edf3TELEM_AHTX_ADDRESSTb4b4b4, Ta5d6ff"Ta5d6ffAHT10/AHT20Ta5d6ff"Tb4b4b4, Te6edf3init_ahtx0Tb4b4b4, Te6edf3query_ahtx0 Tb4b4b4}Tb4b4b4,
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72ifdef ENV_INCLUDE_BME680
Tb4b4b4{ Te6edf3TELEM_BME680_ADDRESSTb4b4b4, Ta5d6ff"Ta5d6ffBME680Ta5d6ff"Tb4b4b4, Te6edf3init_bme680Tb4b4b4, Te6edf3query_bme680 Tb4b4b4}Tb4b4b4,
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if ENV_INCLUDE_BME680_BSEC
Tb4b4b4{ Te6edf3TELEM_BME680_ADDRESSTb4b4b4, Ta5d6ff"Ta5d6ffBME680+BSECTa5d6ff"Tb4b4b4, Te6edf3init_bme680_bsecTb4b4b4, Te6edf3query_bme680_bsec Tb4b4b4}Tb4b4b4,
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if ENV_INCLUDE_BME280
Tb4b4b4{ Te6edf3TELEM_BME280_ADDRESSTb4b4b4, Ta5d6ff"Ta5d6ffBME280Ta5d6ff"Tb4b4b4, Te6edf3init_bme280Tb4b4b4, Te6edf3query_bme280 Tb4b4b4}Tb4b4b4,
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if ENV_INCLUDE_BMP280
Tb4b4b4{ Te6edf3TELEM_BMP280_ADDRESSTb4b4b4, Ta5d6ff"Ta5d6ffBMP280Ta5d6ff"Tb4b4b4, Te6edf3init_bmp280Tb4b4b4, Te6edf3query_bmp280 Tb4b4b4}Tb4b4b4,
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if ENV_INCLUDE_SHTC3
Tb4b4b4{ T79c0ff0x70Tb4b4b4, Ta5d6ff"Ta5d6ffSHTC3Ta5d6ff"Tb4b4b4, Te6edf3init_shtc3Tb4b4b4, Te6edf3query_shtc3 Tb4b4b4}Tb4b4b4,
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if ENV_INCLUDE_SHT4X
Tb4b4b4{ Te6edf3TELEM_SHT4X_ADDRESSTb4b4b4, Ta5d6ff"Ta5d6ffSHT4XTa5d6ff"Tb4b4b4, Te6edf3init_sht4xTb4b4b4, Te6edf3query_sht4x Tb4b4b4}Tb4b4b4,
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if ENV_INCLUDE_LPS22HB
Tb4b4b4{ T79c0ff0x5CTb4b4b4, Ta5d6ff"Ta5d6ffLPS22HBTa5d6ff"Tb4b4b4, Te6edf3init_lps22hbTb4b4b4, Te6edf3query_lps22hb Tb4b4b4}Tb4b4b4,
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if ENV_INCLUDE_INA3221
Tb4b4b4{ Te6edf3TELEM_INA3221_ADDRESSTb4b4b4, Ta5d6ff"Ta5d6ffINA3221Ta5d6ff"Tb4b4b4, Te6edf3init_ina3221Tb4b4b4, Te6edf3query_ina3221 Tb4b4b4}Tb4b4b4,
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if ENV_INCLUDE_INA219
Tb4b4b4{ Te6edf3TELEM_INA219_ADDRESSTb4b4b4, Ta5d6ff"Ta5d6ffINA219Ta5d6ff"Tb4b4b4, Te6edf3init_ina219Tb4b4b4, Te6edf3query_ina219 Tb4b4b4}Tb4b4b4,
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if ENV_INCLUDE_INA260
Tb4b4b4{ Te6edf3TELEM_INA260_ADDRESSTb4b4b4, Ta5d6ff"Ta5d6ffINA260Ta5d6ff"Tb4b4b4, Te6edf3init_ina260Tb4b4b4, Te6edf3query_ina260 Tb4b4b4}Tb4b4b4,
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if ENV_INCLUDE_INA226
Tb4b4b4{ Te6edf3TELEM_INA226_ADDRESSTb4b4b4, Ta5d6ff"Ta5d6ffINA226Ta5d6ff"Tb4b4b4, Te6edf3init_ina226Tb4b4b4, Te6edf3query_ina226 Tb4b4b4}Tb4b4b4,
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if ENV_INCLUDE_MLX90614
Tb4b4b4{ Te6edf3TELEM_MLX90614_ADDRESSTb4b4b4,Ta5d6ff"Ta5d6ffMLX90614Ta5d6ff"Tb4b4b4, Te6edf3init_mlx90614Tb4b4b4, Te6edf3query_mlx90614 Tb4b4b4}Tb4b4b4,
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if ENV_INCLUDE_VL53L0X
Tb4b4b4{ Te6edf3TELEM_VL53L0X_ADDRESSTb4b4b4, Ta5d6ff"Ta5d6ffVL53L0XTa5d6ff"Tb4b4b4, Te6edf3init_vl53l0xTb4b4b4, Te6edf3query_vl53l0x Tb4b4b4}Tb4b4b4,
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72ifdef ENV_INCLUDE_BMP085
Tb4b4b4{ T79c0ff0x77Tb4b4b4, Ta5d6ff"Ta5d6ffBMP085Ta5d6ff"Tb4b4b4, Te6edf3init_bmp085Tb4b4b4, Te6edf3query_bmp085 Tb4b4b4}Tb4b4b4,
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if ENV_INCLUDE_RAK12035
Tb4b4b4{ Te6edf3TELEM_RAK12035_ADDRESSTb4b4b4,Ta5d6ff"Ta5d6ffRAK12035Ta5d6ff"Tb4b4b4, Te6edf3init_rak12035Tb4b4b4, Te6edf3query_rak12035 Tb4b4b4}Tb4b4b4,
Tff7b72#Tff7b72endif
Tb4b4b4{ T79c0ff0Tb4b4b4, Tffa657nullptrTb4b4b4, Tffa657nullptrTb4b4b4, Tffa657nullptr Tb4b4b4} T8b949e// sentinel — keeps the array non-empty
Tb4b4b4}Tb4b4b4;
Tff7b72static Tff7b72const Tffa657size_t Te6edf3SENSOR_TABLE_SIZE Tff7b72= Tb4b4b4(Tff7b72sizeofTb4b4b4(Te6edf3SENSOR_TABLETb4b4b4) Tff7b72/ Tff7b72sizeofTb4b4b4(Te6edf3SENSOR_TABLETb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)Tb4b4b4) Tff7b72- T79c0ff1Tb4b4b4;
T8b949e// ============================================================
T8b949e// begin() — scan the I2C bus, then initialize only what was
T8b949e// found. A sensor whose address does not ACK during the scan
T8b949e// is never touched by a library call, preventing hangs or
T8b949e// crashes caused by absent or misbehaving hardware.
T8b949e// ============================================================
Tffa657bool Td2a8ffEnvironmentSensorManager::beginTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72#Tff7b72if ENV_INCLUDE_GPS
Tff7b72#Tff7b72ifdef RAK_WISBLOCK_GPS
Te6edf3rakGPSInitTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72else
Te6edf3initBasicGPSTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if ENV_PIN_SDA && ENV_PIN_SCL
Tff7b72#Tff7b72ifdef NRF52_PLATFORM
Te6edf3Wire1Tb4b4b4.Te6edf3setPinsTb4b4b4(Te6edf3ENV_PIN_SDATb4b4b4, Te6edf3ENV_PIN_SCLTb4b4b4)Tb4b4b4;
Te6edf3Wire1Tb4b4b4.Te6edf3setClockTb4b4b4(T79c0ff100000Tb4b4b4)Tb4b4b4;
Te6edf3Wire1Tb4b4b4.Te6edf3beginTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72else
Te6edf3Wire1Tb4b4b4.Te6edf3beginTb4b4b4(Te6edf3ENV_PIN_SDATb4b4b4, Te6edf3ENV_PIN_SCLTb4b4b4, T79c0ff100000Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ffSecond I2C initialized on pins SDA: %d SCL: %dTa5d6ff"Tb4b4b4, Te6edf3ENV_PIN_SDATb4b4b4, Te6edf3ENV_PIN_SCLTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
T8b949e// Scan the I2C bus before touching any sensor library.
Tffa657bool Te6edf3detectedTb4b4b4[T79c0ff128Tb4b4b4] Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4;
Te6edf3scanI2CBusTb4b4b4(Te6edf3TELEM_WIRETb4b4b4, Te6edf3detectedTb4b4b4)Tb4b4b4;
T8b949e// Walk the sensor table and initialize only detected devices.
Te6edf3_active_sensor_count Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72for Tb4b4b4(Tffa657size_t Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3SENSOR_TABLE_SIZE Tff7b72&Tff7b72& Te6edf3_active_sensor_count Tff7b72< Te6edf3MAX_ACTIVE_SENSORSTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3SensorDefTff7b72& Te6edf3def Tff7b72= Te6edf3SENSOR_TABLETb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3detectedTb4b4b4[Te6edf3defTb4b4b4.Te6edf3addressTb4b4b4]Tb4b4b4) Tb4b4b4{
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ff%s not detected at I2C address %02XTa5d6ff"Tb4b4b4, Te6edf3defTb4b4b4.Te6edf3nameTb4b4b4, Te6edf3defTb4b4b4.Te6edf3addressTb4b4b4)Tb4b4b4;
Tff7b72continueTb4b4b4;
Tb4b4b4}
Tffa657uint8_t Te6edf3n Tff7b72= Te6edf3defTb4b4b4.Te6edf3initTb4b4b4(Te6edf3TELEM_WIRETb4b4b4, Te6edf3defTb4b4b4.Te6edf3addressTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3n Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ff%s found at %02X but failed to initializeTa5d6ff"Tb4b4b4, Te6edf3defTb4b4b4.Te6edf3nameTb4b4b4, Te6edf3defTb4b4b4.Te6edf3addressTb4b4b4)Tb4b4b4;
Tff7b72continueTb4b4b4;
Tb4b4b4}
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ffFound %s at address: %02XTa5d6ff"Tb4b4b4, Te6edf3defTb4b4b4.Te6edf3nameTb4b4b4, Te6edf3defTb4b4b4.Te6edf3addressTb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Tffa657uint8_t Te6edf3sub Tff7b72= T79c0ff0Tb4b4b4; Te6edf3sub Tff7b72< Te6edf3n Tff7b72&Tff7b72& Te6edf3_active_sensor_count Tff7b72< Te6edf3MAX_ACTIVE_SENSORSTb4b4b4; Te6edf3subTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Te6edf3_active_sensorsTb4b4b4[Te6edf3_active_sensor_countTff7b72+Tff7b72+Tb4b4b4] Tff7b72= Tb4b4b4{ Te6edf3defTb4b4b4.Te6edf3queryTb4b4b4, Te6edf3sub Tb4b4b4}Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72return Tffa657trueTb4b4b4;
Tb4b4b4}
T8b949e// ============================================================
T8b949e// querySensors() — GPS stays on channel 1; each active sensor
T8b949e// gets the next available channel in the order it was
T8b949e// initialized.
T8b949e// ============================================================
Tffa657bool Td2a8ffEnvironmentSensorManager::querySensorsTb4b4b4(Tffa657uint8_t Te6edf3requester_permissionsTb4b4b4, Te6edf3CayenneLPPTff7b72& Te6edf3telemetryTb4b4b4) Tb4b4b4{
Te6edf3next_available_channel Tff7b72= Te6edf3TELEM_CHANNEL_SELF Tff7b72+ T79c0ff1Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3requester_permissions Tff7b72& Te6edf3TELEM_PERM_LOCATION Tff7b72&Tff7b72& Te6edf3gps_activeTb4b4b4) Tb4b4b4{
Te6edf3telemetryTb4b4b4.Te6edf3addGPSTb4b4b4(Te6edf3TELEM_CHANNEL_SELFTb4b4b4, Te6edf3node_latTb4b4b4, Te6edf3node_lonTb4b4b4, Te6edf3node_altitudeTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3requester_permissions Tff7b72& Te6edf3TELEM_PERM_ENVIRONMENTTb4b4b4) Tb4b4b4{
Tff7b72for Tb4b4b4(Tffa657int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3_active_sensor_countTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Te6edf3_active_sensorsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4.Te6edf3queryTb4b4b4(Te6edf3next_available_channelTb4b4b4, Te6edf3_active_sensorsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4.Te6edf3sub_channelTb4b4b4, Te6edf3telemetryTb4b4b4)Tb4b4b4;
Te6edf3next_available_channelTff7b72+Tff7b72+Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72return Tffa657trueTb4b4b4;
Tb4b4b4}
Tffa657int Td2a8ffEnvironmentSensorManager::getNumSettingsTb4b4b4(Tb4b4b4) Tff7b72const Tb4b4b4{
Tffa657int Te6edf3settings Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72#Tff7b72if ENV_INCLUDE_GPS
Tff7b72if Tb4b4b4(Te6edf3gps_detectedTb4b4b4) Te6edf3settingsTff7b72+Tff7b72+Tb4b4b4; T8b949e// only show GPS setting if GPS is detected
Tff7b72#Tff7b72endif
Tff7b72return Te6edf3settingsTb4b4b4;
Tb4b4b4}
Tff7b72const Tffa657charTff7b72* Td2a8ffEnvironmentSensorManager::getSettingNameTb4b4b4(Tffa657int Te6edf3iTb4b4b4) Tff7b72const Tb4b4b4{
Tffa657int Te6edf3settings Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72#Tff7b72if ENV_INCLUDE_GPS
Tff7b72if Tb4b4b4(Te6edf3gps_detected Tff7b72&Tff7b72& Te6edf3i Tff7b72=Tff7b72= Te6edf3settingsTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Tff7b72return Ta5d6ff"Ta5d6ffgpsTa5d6ff"Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Tff7b72return Tffa657NULLTb4b4b4;
Tb4b4b4}
Tff7b72const Tffa657charTff7b72* Td2a8ffEnvironmentSensorManager::getSettingValueTb4b4b4(Tffa657int Te6edf3iTb4b4b4) Tff7b72const Tb4b4b4{
Tffa657int Te6edf3settings Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72#Tff7b72if ENV_INCLUDE_GPS
Tff7b72if Tb4b4b4(Te6edf3gps_detected Tff7b72&Tff7b72& Te6edf3i Tff7b72=Tff7b72= Te6edf3settingsTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3gps_active Tff7b72? Ta5d6ff"Ta5d6ff1Ta5d6ff" Tff7b72: Ta5d6ff"Ta5d6ff0Ta5d6ff"Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Tff7b72return Tffa657NULLTb4b4b4;
Tb4b4b4}
Tffa657bool Td2a8ffEnvironmentSensorManager::setSettingValueTb4b4b4(Tff7b72const Tffa657charTff7b72* Te6edf3nameTb4b4b4, Tff7b72const Tffa657charTff7b72* Te6edf3valueTb4b4b4) Tb4b4b4{
Tff7b72#Tff7b72if ENV_INCLUDE_GPS
Tff7b72if Tb4b4b4(Te6edf3gps_detected Tff7b72&Tff7b72& Te6edf3strcmpTb4b4b4(Te6edf3nameTb4b4b4, Ta5d6ff"Ta5d6ffgpsTa5d6ff"Tb4b4b4) Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3strcmpTb4b4b4(Te6edf3valueTb4b4b4, Ta5d6ff"Ta5d6ff0Ta5d6ff"Tb4b4b4) Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3stop_gpsTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3start_gpsTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Tffa657trueTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3strcmpTb4b4b4(Te6edf3nameTb4b4b4, Ta5d6ff"Ta5d6ffgps_intervalTa5d6ff"Tb4b4b4) Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
Tffa657uint32_t Te6edf3interval_seconds Tff7b72= Te6edf3atoiTb4b4b4(Te6edf3valueTb4b4b4)Tb4b4b4;
Te6edf3gps_update_interval_sec Tff7b72= Te6edf3interval_seconds Tff7b72> T79c0ff0 Tff7b72? Te6edf3interval_seconds Tff7b72: T79c0ff1Tb4b4b4;
Tff7b72return Tffa657trueTb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Tff7b72return Tffa657falseTb4b4b4; T8b949e// not supported
Tb4b4b4}
Tff7b72#Tff7b72if ENV_INCLUDE_GPS
Tffa657void Td2a8ffEnvironmentSensorManager::initBasicGPSTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3Serial1Tb4b4b4.Te6edf3setPinsTb4b4b4(Te6edf3PIN_GPS_TXTb4b4b4, Te6edf3PIN_GPS_RXTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72ifdef GPS_BAUD_RATE
Te6edf3Serial1Tb4b4b4.Te6edf3beginTb4b4b4(Te6edf3GPS_BAUD_RATETb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72else
Te6edf3Serial1Tb4b4b4.Te6edf3beginTb4b4b4(T79c0ff9600Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
T8b949e// Try to detect if GPS is physically connected to determine if we should expose the setting
Te6edf3_locationTff7b72-Tff7b72>Te6edf3beginTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3_locationTff7b72-Tff7b72>Te6edf3resetTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72ifndef PIN_GPS_EN
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ffNo GPS wake/reset pin found for this board. Continuing on...Ta5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
T8b949e// Give GPS a moment to power up and send data
Te6edf3delayTb4b4b4(T79c0ff1000Tb4b4b4)Tb4b4b4;
T8b949e// We'll consider GPS detected if we see any data on Serial1
Tff7b72#Tff7b72ifdef ENV_SKIP_GPS_DETECT
Te6edf3gps_detected Tff7b72= Tffa657trueTb4b4b4;
Tff7b72#Tff7b72else
Te6edf3gps_detected Tff7b72= Tb4b4b4(Te6edf3Serial1Tb4b4b4.Te6edf3availableTb4b4b4(Tb4b4b4) Tff7b72> T79c0ff0Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72if Tb4b4b4(Te6edf3gps_detectedTb4b4b4) Tb4b4b4{
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ffGPS detectedTa5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72ifdef PERSISTANT_GPS
Te6edf3gps_active Tff7b72= Tffa657trueTb4b4b4;
Tff7b72returnTb4b4b4;
Tff7b72#Tff7b72endif
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ffNo GPS detectedTa5d6ff"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3_locationTff7b72-Tff7b72>Te6edf3stopTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3gps_active Tff7b72= Tffa657falseTb4b4b4; T8b949e//Set GPS visibility off until setting is changed
Tb4b4b4}
T8b949e// gps code for rak might be moved to MicroNMEALoactionProvider
T8b949e// or make a new location provider ...
Tff7b72#Tff7b72ifdef RAK_WISBLOCK_GPS
Tffa657void Td2a8ffEnvironmentSensorManager::rakGPSInitTb4b4b4(Tb4b4b4)Tb4b4b4{
Te6edf3Serial1Tb4b4b4.Te6edf3setPinsTb4b4b4(Te6edf3PIN_GPS_TXTb4b4b4, Te6edf3PIN_GPS_RXTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72ifdef GPS_BAUD_RATE
Te6edf3Serial1Tb4b4b4.Te6edf3beginTb4b4b4(Te6edf3GPS_BAUD_RATETb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72else
Te6edf3Serial1Tb4b4b4.Te6edf3beginTb4b4b4(T79c0ff9600Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
T8b949e//search for the correct IO standby pin depending on socket used
Tff7b72ifTb4b4b4(Te6edf3gpsIsAwakeTb4b4b4(Te6edf3WB_IO2Tb4b4b4)Tb4b4b4)Tb4b4b4{
Tb4b4b4}
Tff7b72else Tff7b72ifTb4b4b4(Te6edf3gpsIsAwakeTb4b4b4(Te6edf3WB_IO4Tb4b4b4)Tb4b4b4)Tb4b4b4{
Tb4b4b4}
Tff7b72else Tff7b72ifTb4b4b4(Te6edf3gpsIsAwakeTb4b4b4(Te6edf3WB_IO5Tb4b4b4)Tb4b4b4)Tb4b4b4{
Tb4b4b4}
Tff7b72elseTb4b4b4{
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ffNo GPS foundTa5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3gps_active Tff7b72= Tffa657falseTb4b4b4;
Te6edf3gps_detected Tff7b72= Tffa657falseTb4b4b4;
Te6edf3Serial1Tb4b4b4.Te6edf3endTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72ifndef FORCE_GPS_ALIVE T8b949e// for use with repeaters, until GPS toggle is implimented
T8b949e//Now that GPS is found and set up, set to sleep for initial state
Te6edf3stop_gpsTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tb4b4b4}
Tffa657bool Td2a8ffEnvironmentSensorManager::gpsIsAwakeTb4b4b4(Tffa657uint8_t Te6edf3ioPinTb4b4b4)Tb4b4b4{
Tff7b72#Tff7b72if defined(ETHERNET_ENABLED) && defined(RAK_BOARD)
Tff7b72if Tb4b4b4(Te6edf3ioPin Tff7b72=Tff7b72= Te6edf3WB_IO2Tb4b4b4) Tb4b4b4{
T8b949e// WB_IO2 powers the Ethernet module on RAK baseboards.
Tff7b72return Tffa657falseTb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
T8b949e//set initial waking state
Te6edf3pinModeTb4b4b4(Te6edf3ioPinTb4b4b4,Te6edf3OUTPUTTb4b4b4)Tb4b4b4;
Te6edf3digitalWriteTb4b4b4(Te6edf3ioPinTb4b4b4,Te6edf3LOWTb4b4b4)Tb4b4b4;
Te6edf3delayTb4b4b4(T79c0ff500Tb4b4b4)Tb4b4b4;
Te6edf3digitalWriteTb4b4b4(Te6edf3ioPinTb4b4b4,Te6edf3HIGHTb4b4b4)Tb4b4b4;
Te6edf3delayTb4b4b4(T79c0ff500Tb4b4b4)Tb4b4b4;
T8b949e//Try to init RAK12500 on I2C
Tff7b72if Tb4b4b4(Te6edf3ublox_GNSSTb4b4b4.Te6edf3beginTb4b4b4(Te6edf3WireTb4b4b4) Tff7b72=Tff7b72= Tffa657trueTb4b4b4)Tb4b4b4{
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ffRAK12500 GPS init correctly with pin %iTa5d6ff"Tb4b4b4,Te6edf3ioPinTb4b4b4)Tb4b4b4;
Te6edf3ublox_GNSSTb4b4b4.Te6edf3setI2COutputTb4b4b4(Te6edf3COM_TYPE_UBXTb4b4b4)Tb4b4b4;
Te6edf3ublox_GNSSTb4b4b4.Te6edf3enableGNSSTb4b4b4(Tffa657trueTb4b4b4, Te6edf3SFE_UBLOX_GNSS_ID_GPSTb4b4b4)Tb4b4b4;
Te6edf3ublox_GNSSTb4b4b4.Te6edf3enableGNSSTb4b4b4(Tffa657trueTb4b4b4, Te6edf3SFE_UBLOX_GNSS_ID_GALILEOTb4b4b4)Tb4b4b4;
Te6edf3ublox_GNSSTb4b4b4.Te6edf3enableGNSSTb4b4b4(Tffa657trueTb4b4b4, Te6edf3SFE_UBLOX_GNSS_ID_GLONASSTb4b4b4)Tb4b4b4;
Te6edf3ublox_GNSSTb4b4b4.Te6edf3enableGNSSTb4b4b4(Tffa657trueTb4b4b4, Te6edf3SFE_UBLOX_GNSS_ID_SBASTb4b4b4)Tb4b4b4;
Te6edf3ublox_GNSSTb4b4b4.Te6edf3enableGNSSTb4b4b4(Tffa657trueTb4b4b4, Te6edf3SFE_UBLOX_GNSS_ID_BEIDOUTb4b4b4)Tb4b4b4;
Te6edf3ublox_GNSSTb4b4b4.Te6edf3enableGNSSTb4b4b4(Tffa657trueTb4b4b4, Te6edf3SFE_UBLOX_GNSS_ID_IMESTb4b4b4)Tb4b4b4;
Te6edf3ublox_GNSSTb4b4b4.Te6edf3enableGNSSTb4b4b4(Tffa657trueTb4b4b4, Te6edf3SFE_UBLOX_GNSS_ID_QZSSTb4b4b4)Tb4b4b4;
Te6edf3ublox_GNSSTb4b4b4.Te6edf3setMeasurementRateTb4b4b4(T79c0ff1000Tb4b4b4)Tb4b4b4;
Te6edf3ublox_GNSSTb4b4b4.Te6edf3saveConfigSelectiveTb4b4b4(Te6edf3VAL_CFG_SUBSEC_IOPORTTb4b4b4)Tb4b4b4;
Te6edf3gpsResetPin Tff7b72= Te6edf3ioPinTb4b4b4;
Te6edf3i2cGPSFlag Tff7b72= Tffa657trueTb4b4b4;
Te6edf3gps_active Tff7b72= Tffa657trueTb4b4b4;
Te6edf3gps_detected Tff7b72= Tffa657trueTb4b4b4;
Te6edf3_location Tff7b72= Tff7b72&Te6edf3RAK12500_providerTb4b4b4;
Tff7b72return Tffa657trueTb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3Serial1Tb4b4b4.Te6edf3availableTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ffSerial GPS init correctly and is turned onTa5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72ifdef PIN_GPS_EN
Tff7b72ifTb4b4b4(Te6edf3PIN_GPS_ENTb4b4b4)Tb4b4b4{
Te6edf3gpsResetPin Tff7b72= Te6edf3PIN_GPS_ENTb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Te6edf3serialGPSFlag Tff7b72= Tffa657trueTb4b4b4;
Te6edf3gps_active Tff7b72= Tffa657trueTb4b4b4;
Te6edf3gps_detected Tff7b72= Tffa657trueTb4b4b4;
Tff7b72return Tffa657trueTb4b4b4;
Tb4b4b4}
Te6edf3pinModeTb4b4b4(Te6edf3ioPinTb4b4b4, Te6edf3INPUTTb4b4b4)Tb4b4b4;
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ffGPS did not init with this IO pin... try the nextTa5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72return Tffa657falseTb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Tffa657void Td2a8ffEnvironmentSensorManager::start_gpsTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3gps_active Tff7b72= Tffa657trueTb4b4b4;
Tff7b72#Tff7b72ifdef RAK_WISBLOCK_GPS
Te6edf3pinModeTb4b4b4(Te6edf3gpsResetPinTb4b4b4, Te6edf3OUTPUTTb4b4b4)Tb4b4b4;
Te6edf3digitalWriteTb4b4b4(Te6edf3gpsResetPinTb4b4b4, Te6edf3HIGHTb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tff7b72#Tff7b72endif
Te6edf3_locationTff7b72-Tff7b72>Te6edf3beginTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3_locationTff7b72-Tff7b72>Te6edf3resetTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72ifndef PIN_GPS_EN
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ffStart GPS is N/A on this board. Actual GPS state unchangedTa5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tb4b4b4}
Tffa657void Td2a8ffEnvironmentSensorManager::stop_gpsTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3gps_active Tff7b72= Tffa657falseTb4b4b4;
Tff7b72#Tff7b72ifdef RAK_WISBLOCK_GPS
Te6edf3pinModeTb4b4b4(Te6edf3gpsResetPinTb4b4b4, Te6edf3OUTPUTTb4b4b4)Tb4b4b4;
Te6edf3digitalWriteTb4b4b4(Te6edf3gpsResetPinTb4b4b4, Te6edf3LOWTb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tff7b72#Tff7b72endif
Te6edf3_locationTff7b72-Tff7b72>Te6edf3stopTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72ifndef PIN_GPS_EN
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ffStop GPS is N/A on this board. Actual GPS state unchangedTa5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tb4b4b4}
Tff7b72#Tff7b72endif T8b949e// ENV_INCLUDE_GPS
Tff7b72#Tff7b72if ENV_INCLUDE_GPS || defined(ENV_INCLUDE_BME680_BSEC)
Tffa657void Td2a8ffEnvironmentSensorManager::loopTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72#Tff7b72if ENV_INCLUDE_GPS
Tff7b72static Tffa657unsigned Tffa657long Te6edf3next_gps_update Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3gps_activeTb4b4b4) Tb4b4b4{
Te6edf3_locationTff7b72-Tff7b72>Te6edf3loopTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tb4b4b4(Tffa657longTb4b4b4)Tb4b4b4(Te6edf3millisTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3next_gps_updateTb4b4b4) Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Tff7b72ifTb4b4b4(Te6edf3gps_activeTb4b4b4)Tb4b4b4{
Tff7b72#Tff7b72ifdef RAK_WISBLOCK_GPS
Tff7b72if Tb4b4b4(Tb4b4b4(Te6edf3i2cGPSFlag Tff7b72|Tff7b72| Te6edf3serialGPSFlagTb4b4b4) Tff7b72&Tff7b72& Te6edf3_locationTff7b72-Tff7b72>Te6edf3isValidTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3node_lat Tff7b72= Tb4b4b4(Tb4b4b4(Tffa657doubleTb4b4b4)Te6edf3_locationTff7b72-Tff7b72>Te6edf3getLatitudeTb4b4b4(Tb4b4b4)Tb4b4b4)Tff7b72/T79c0ff1000000.Tb4b4b4;
Te6edf3node_lon Tff7b72= Tb4b4b4(Tb4b4b4(Tffa657doubleTb4b4b4)Te6edf3_locationTff7b72-Tff7b72>Te6edf3getLongitudeTb4b4b4(Tb4b4b4)Tb4b4b4)Tff7b72/T79c0ff1000000.Tb4b4b4;
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6fflat %f lon %fTa5d6ff"Tb4b4b4, Te6edf3node_latTb4b4b4, Te6edf3node_lonTb4b4b4)Tb4b4b4;
Te6edf3node_altitude Tff7b72= Tb4b4b4(Tb4b4b4(Tffa657doubleTb4b4b4)Te6edf3_locationTff7b72-Tff7b72>Te6edf3getAltitudeTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72/ T79c0ff1000.0Tb4b4b4;
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6fflat %f lon %f alt %fTa5d6ff"Tb4b4b4, Te6edf3node_latTb4b4b4, Te6edf3node_lonTb4b4b4, Te6edf3node_altitudeTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72else
Tff7b72if Tb4b4b4(Te6edf3_locationTff7b72-Tff7b72>Te6edf3isValidTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3node_lat Tff7b72= Tb4b4b4(Tb4b4b4(Tffa657doubleTb4b4b4)Te6edf3_locationTff7b72-Tff7b72>Te6edf3getLatitudeTb4b4b4(Tb4b4b4)Tb4b4b4)Tff7b72/T79c0ff1000000.Tb4b4b4;
Te6edf3node_lon Tff7b72= Tb4b4b4(Tb4b4b4(Tffa657doubleTb4b4b4)Te6edf3_locationTff7b72-Tff7b72>Te6edf3getLongitudeTb4b4b4(Tb4b4b4)Tb4b4b4)Tff7b72/T79c0ff1000000.Tb4b4b4;
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6fflat %f lon %fTa5d6ff"Tb4b4b4, Te6edf3node_latTb4b4b4, Te6edf3node_lonTb4b4b4)Tb4b4b4;
Te6edf3node_altitude Tff7b72= Tb4b4b4(Tb4b4b4(Tffa657doubleTb4b4b4)Te6edf3_locationTff7b72-Tff7b72>Te6edf3getAltitudeTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72/ T79c0ff1000.0Tb4b4b4;
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6fflat %f lon %f alt %fTa5d6ff"Tb4b4b4, Te6edf3node_latTb4b4b4, Te6edf3node_lonTb4b4b4, Te6edf3node_altitudeTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Tb4b4b4}
Te6edf3next_gps_update Tff7b72= Te6edf3millisTb4b4b4(Tb4b4b4) Tff7b72+ Tb4b4b4(Te6edf3gps_update_interval_sec Tff7b72* T79c0ff1000Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if ENV_INCLUDE_BME680_BSEC
Tff7b72if Tb4b4b4(Te6edf3bsec_active Tff7b72&Tff7b72& Te6edf3bsec_iaqTb4b4b4.Te6edf3runTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tffa657uint8_t Te6edf3prev_accuracy Tff7b72= Te6edf3bsec_accuracyTb4b4b4;
Te6edf3bsec_temperature Tff7b72= Te6edf3bsec_iaqTb4b4b4.Te6edf3temperatureTb4b4b4;
Te6edf3bsec_humidity Tff7b72= Te6edf3bsec_iaqTb4b4b4.Te6edf3humidityTb4b4b4;
Te6edf3bsec_pressure_hpa Tff7b72= Te6edf3bsec_iaqTb4b4b4.Te6edf3pressure Tff7b72/ T79c0ff100.0fTb4b4b4;
Te6edf3bsec_iaq_val Tff7b72= Te6edf3bsec_iaqTb4b4b4.Te6edf3iaqTb4b4b4;
Te6edf3bsec_accuracy Tff7b72= Te6edf3bsec_iaqTb4b4b4.Te6edf3iaqAccuracyTb4b4b4;
Te6edf3bsec_data_ready Tff7b72= Tffa657trueTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3bsec_accuracy Tff7b72=Tff7b72= T79c0ff3Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3bsec_first_save_doneTb4b4b4) Tb4b4b4{
Te6edf3bsec_save_stateTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3bsec_last_save_ms Tff7b72= Te6edf3millisTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3bsec_first_save_done Tff7b72= Tffa657trueTb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Tb4b4b4(Te6edf3millisTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3bsec_last_save_msTb4b4b4) Tff7b72>Tff7b72= Te6edf3BSEC_SAVE_INTERVAL_MSTb4b4b4) Tb4b4b4{
Te6edf3bsec_save_stateTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3bsec_last_save_ms Tff7b72= Te6edf3millisTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72#Tff7b72endif T8b949e// ENV_INCLUDE_BME680_BSEC
Tb4b4b4}
Tff7b72#Tff7b72endif T8b949e// ENV_INCLUDE_GPS || ENV_INCLUDE_BME680_BSEC
Served by rngit 1.5.2 - Generated in 0.2s